/* * Laver en labyrint med dybde først i en graf. * Det bliver ikke nogen særlig god labyrint, * men det ser flot ud rent grafisk. */ int width = 50; int height = 50; int[] deltaX = { -1, 1, 0, 0 }; int[] deltaY = { 0, 0, -1, 1 }; boolean[][] besøgt = new boolean[ width ][ height ]; // initialiser PixelPanel PixelPanel panel = new PixelPanel( 2 * width + 1, 2 * height + 1 ); panel.setTitle( "Labyrinth" ); panel.clear( Colors.White ); panel.update(); besøg( 0, 2 ); /* * rekursivt dybde først besøg af knuden ( x, y ) */ void besøg( int x, int y ) { besøgt[ x ][ y ] = true; int[] index = random4(); for ( int i=0; i<4; i++ ) { int naboX = x + deltaX[ index[ i ] ]; int naboY = y + deltaY[ index[ i ] ]; if ( indexOkay( naboX, naboY ) && !besøgt[ naboX ][ naboY ] ) { //println( "(" + x + "," + y + ") -> (" + naboX + "," + naboY + ")" ); tegnKant( x, y, naboX, naboY ); besøg( naboX, naboY ); } } } /* * ligger ( x, y ) inden for rammerne af 'besøgt'-arrayet */ boolean indexOkay( int x, int y ) { return 0 <= x && x < width && 0 <= y && y < height; } /* * laver array med tallene 0..3; hvis disse er blandet tilfældigt */ int[] random4() { int[] array = new int[ 4 ]; // indsætter 0..3 for ( int i=0; i<4; i++ ) array[ i ] = i; int[] result = new int[ array.length ]; int index=0; // flyt tal fra 'array' til 'result' i tilfældig rækkefølge while ( index < result.length ) { int i = random( array.length ); if ( array[ i ] != -1 ) { // flyt tal over result[ index++ ] = array[ i ]; array[ i ] = -1; } } return result; } /* * tegn en kant mellem knuderne( xStart, yStart ) og ( xEnd, yEnd ) */ void tegnKant( int xStart, int yStart, int xEnd, int yEnd ) { xStart = 2 * xStart + 1; yStart = 2 * yStart + 1; xEnd = 2 * xEnd + 1; yEnd = 2 * yEnd + 1; panel.drawPixel( xStart, yStart, Colors.Black ); panel.drawPixel( xEnd, yEnd, Colors.Black ); // de svære! if ( xStart == xEnd ) // lodret panel.drawPixel( xStart, ( yStart + yEnd ) / 2, Colors.Black ); else // vandret panel.drawPixel( ( xStart + xEnd ) / 2, yStart, Colors.Black ); panel.update(); }